import scala.language.implicitConversions

object Demo20Implicit01 {
  def main(args: Array[String]): Unit = {
    /**
     * 隐式转换
     * 在编写代码时 有些东西可以省略 让Scala的编译器自动去推断
     * 能够减少代码的冗余
     *
     * 1、隐式转换函数
     * 2、隐式转换变量
     * 3、隐式转换类
     */

    def func1(int: Int): Unit = {
      println(int + 100)
    }

    // 隐式转换函数
    implicit def str2Int(str: String): Int = {
      Integer.parseInt(str)
    }

    func1(100) // 200
    func1(200) // 300
    val strVal: String = "100"
    // 类型不匹配所以报错
    //    func1(strVal)
    func1(Integer.parseInt(strVal)) // 可以使用Integer将String转为Int再传入func1函数
    func1(str2Int(strVal)) // 可以使用str2Int方法将String转为Int再传入func1函数

    /**
     *  编译时 Scala编译器会自动去寻找一个函数(String=>Int)，即找到了 隐式转换函数str2Int
     *  然后就会将String类型的值strVal 借助 隐式转换函数str2Int 将其变成Int类型并传入func1
     */
    func1(strVal)

  }

}
